election_data: archivo con las elecciones al congresocod_mun: archivo con los códigos y nombres de cada municipioabbrev: siglas de cada partidosurveys: encuestas electorales desde 1982.Nos ocupamos primero de las encuestas:
Eliminar los datos de surveys:
se refieran a elecciones anteriores a 2008
sean a pie de urna
tamaño muestral desconocido o inferior a 500.
tenga 1 día o menos de trabajo de campo.
Seguimos con los datos electorales
election_data <-
election_data |>
select(-c(tipo_eleccion,
codigo_distrito_electoral,
numero_mesas,
vuelta))
#Combinamos los codigos para formar id_municipio
election_data <-
election_data|>
mutate(id_municipio = glue("{codigo_ccaa}{codigo_provincia}{codigo_municipio}")) |>
relocate(id_municipio, .before=codigo_ccaa)
#Mantenemos part1 y part2 pq nos pueden resultar útiles para alguna pregunta más adelante
election_data <-
election_data |>
select(-c(codigo_ccaa,
codigo_provincia,
codigo_municipio,))
#Configuramos la fecha predeterminada como el día 1 y combinamos el mes y el año para formar una fecha completa.
election_data <-
election_data|>
mutate(fecha = glue("1-{mes}-{anno}")) |>
relocate(fecha, .before=anno) |>
mutate(fecha=dmy(fecha)) |>
select(-c(anno,mes))Convertimos election_data en tidydata
Utilizamos la variable partidos para agrupar todos ellos en solo 12:
“PP” , “UP”, “PSOE” , “PNV” , “Cs” , “ERC” , “CIU”
“MP” , “VOX”, “BNG”, “EH-BILDU” ,“OTROS”
resumen <-
election_data |>
mutate('siglas' = case_when(
str_detect(partidos, regex("EZKER BA|ENTESA|PODEM|COMPROMÍS|IZQUIERDA UNIDA|ESQUERRA UNI|ESQUERDA UNI|I\\.U\\.|IU ")) ~ "UP",
str_detect(partidos, "PP|PARTIDO POPULAR|PARTIT POPULAR") ~ "PP",
str_detect(partidos, "PNV|PARTIDO NACIONALISTA VASCO") ~ "PNV",
str_detect(partidos, "PSOE|PSC|PARTIDO SOCIALISTA|PARTIT SOCIALISTA|PARTIT DELS SOCIALISTES |PARTIDO DOS SOCIALISTA") ~ "PSOE",
str_detect(partidos, "MÁS PAÍS") ~ "MP",
str_detect(partidos, "VOX") ~ "VOX",
str_detect(partidos, "AMAIUR|ARALAR|EUSKO|EUSKAL HERRI|BILDU") ~ "EH-BILDU",
str_detect(partidos, "ERC|ESQUERRA REPUBLICANA DE C|ESQUERRA REPUBLICANA$|ESQUERRA REPUBLICANA/") ~ "ERC",
str_detect(partidos, "BNG|BLOQUE") ~ "BNG",
str_detect(partidos, "CIUTADANS|PARTIDO DE LA CIU") ~ "Cs",
str_detect(partidos, "CONVERGENCIA I| CONVERGENCIA i|CONVERGÈNCIA|UNIÓ D") ~ "CIU",
TRUE ~ "OTROS"
))
unique(resumen$siglas) [1] "OTROS" "EH-BILDU" "PP" "UP" "PSOE" "PNV"
[7] "Cs" "CIU" "ERC" "BNG" "VOX" "MP"
#Primero tenemos que filtrar el dataset abbrev ya que hay partidos que aceptan múltiples siglas
abbrev_sinrepes <-
abbrev |>
group_by(denominacion) |>
slice(1)
# Ahora juntamos el dataset election_data con abbrev_sinrepes para darle a cada partido su correspondiente abreviatura
resumen_2 <-
election_data |>
left_join(abbrev_sinrepes,
by = c('partidos' = 'denominacion'))
resumen_2 <-
resumen_2 |>
mutate(siglas = case_when(
str_detect(siglas, regex("ARALAR|^EA$|AMAIUR|EH Bildu", ignore_case = TRUE)) ~ 'EH-BILDU',
str_detect(siglas, regex("EB-B|ENTESA|PODEMOS|EZKERRA|UP-UPeC|I\\.U\\.", ignore_case = TRUE)) ~ 'UP',
str_detect(siglas, regex("^PP$|P\\.P-E\\.U\\.|PP-PAR|PP-FORO|PP-UPM", ignore_case = TRUE)) ~ 'PP',
str_detect(siglas, regex("PNV", ignore_case = TRUE)) ~ 'PNV',
str_detect(siglas, regex("PSOE|PSC|PSPC|PSE", ignore_case = TRUE)) ~ 'PSOE',
str_detect(siglas, regex("PAÍS|MÉS COMPROM", ignore_case = TRUE)) ~ 'MP',
str_detect(siglas, regex("VOX", ignore_case = TRUE)) ~ 'VOX',
str_detect(siglas, regex("C's", ignore_case = TRUE)) ~ 'Cs',
str_detect(siglas, regex("CiU|CDC|unio.cat", ignore_case = TRUE)) ~ 'CIU',
str_detect(siglas, regex("ERC", ignore_case = TRUE)) ~ 'ERC',
str_detect(siglas, regex("BNG|NÓS", ignore_case = TRUE)) ~ 'BNG',
# Partidos que no aparecen en abbrev que tenemos que incluir'
str_detect(partidos, regex("PARTIT POPULAR|PARTIDO POPULAR|\\(PP\\)", ignore_case = TRUE)) ~ 'PP',
str_detect(partidos, regex("CIUTADANS|PARTIDO DE LA CIU", ignore_case = TRUE)) ~ 'Cs',
str_detect(partidos, regex("CONVERGÈNCIA I", ignore_case = TRUE)) ~ 'CIU',
str_detect(partidos, regex("IZQUIERDA UNIDA|EZKER ANITZA|ESQUERRA UNIDA|^IU$|PODEMOS|AHAL DUGU|ESQUERDA UNIDA-OS VERDES", ignore_case = TRUE)) ~ 'UP',
str_detect(partidos, regex("PSOE|SOCIALISTA OBRER ESPANYOL|DOS SOCIALISTAS", ignore_case = TRUE)) ~ 'PSOE',
str_detect(partidos, regex("(EH Bildu)|PARTIDO POLITICO ARALAR|EUSKO", ignore_case = TRUE)) ~ 'EH-BILDU',
str_detect(partidos, regex("ESQUERRA REPUBLICANA/CATALUNYA SÍ|ESQUERRA REPUBLICANA$", ignore_case = TRUE)) ~ 'ERC',
TRUE ~ 'OTROS'))
unique(resumen_2$siglas) [1] "OTROS" "EH-BILDU" "PP" "UP" "PSOE" "PNV"
[7] "Cs" "CIU" "ERC" "BNG" "VOX" "MP"
Comprobamos si los resultados obtenidos de las 2 maneras son similares:
resumen_agg <-
resumen |>
group_by(siglas,fecha) |>
summarise(total_votos_resumen = sum(votos, na.rm = TRUE),.groups = "drop")
resumen_2_agg <-
resumen_2 |>
group_by(siglas,fecha) |>
summarise(total_votos_resumen_2 = sum(votos, na.rm = TRUE),.groups = "drop")
#filtramos por aquellos donde hay diferencias
resumen_total<-
resumen_agg |>
inner_join(resumen_2_agg,by=c("siglas","fecha")) |>
mutate(dif=total_votos_resumen-total_votos_resumen_2) |>
filter(dif!=0) |>
arrange(desc(dif))
resumen_total# A tibble: 12 × 5
siglas fecha total_votos_resumen total_votos_resumen_2 dif
<chr> <date> <dbl> <dbl> <dbl>
1 UP 2019-04-01 3904519 3136096 768423
2 UP 2019-11-01 3272195 2550852 721343
3 CIU 2015-12-01 630805 65063 565742
4 UP 2016-06-01 4707199 4202593 504606
5 UP 2015-12-01 5629623 5148266 481357
6 UP 2011-11-01 1798887 1660649 138238
7 OTROS 2011-11-01 2200959 2339197 -138238
8 MP 2019-11-01 370222 545238 -175016
9 OTROS 2016-06-01 1026499 1531105 -504606
10 OTROS 2019-11-01 1524511 2070838 -546327
11 OTROS 2019-04-01 1558310 2326733 -768423
12 OTROS 2015-12-01 1243212 2290311 -1047099
Hemos descubierto que las diferencias principales están en en CIU y UP en 2015. Resumen le da 630.000 votos a CIU, pero resumen2 solo 65.000, según la web del ministerio del interior obtuvieron 567.000 (ver fichero Elecciones.xls en el repositorio de Github).
En cuanto a los votos en 2015 para UP, si se suman los de Podemos, Coalición “En Comú Podem” (En Comú), Coalición “Unidad Popular” y Coalición “Compromís - Podemos - És el Moment”, el ministerio de interior dice que obtuvieron 5.700.000 votos, muy cercano al cálculo de resumen, mientras que resumen2 se queda 500.00 votos corto.
Y parecido ocurre con la agrupación para 2016 para UP: resumen 4.700.000 vs resumen2 4.200.000 vs ministerio 5.000.000.
Por tanto creemos que la agrupación resumen es más precisa y usaremos esa agrupación para el resto del trabajo.
Vamos a hacerlo con una función para que acumule en orden de votos los gráficos según la fecha porque hemos encontrado muchos problemas para que reordenara correctamente haciéndolo de manera agregada.
colores = c("PP"="#1A4CA0",
"UP"="#542C85",
"PSOE"="#D50000",
"PNV"="#018B3F",
"Cs"="#EB6109",
"ERC"="#FFCD00",
"CIU"="#1E3A5F",
"MP"="#0fddc4",
"VOX"="#1D7A2A",
"BNG"="#68abde",
"EH-BILDU"="#4C9A2A",
"OTROS"="grey",
"NA"="black")
# Ordenamos los datos por año y votos descendentes
resumen_agg <-
resumen_agg |>
arrange(fecha, desc(total_votos_resumen))
# Calcular el porcentaje de votos para cada partido en cada año
resumen_agg_pct <-
resumen_agg |>
group_by(fecha) |>
mutate(
total_votos_fecha = sum(total_votos_resumen), # Calcular el total de votos por año
porcentaje_votos = (total_votos_resumen / total_votos_fecha) * 100 # Calcular el porcentaje
) |>
ungroup()
# Reordenamos los partidos dentro de cada año según el porcentaje de votos
resumen_agg_pct <-
resumen_agg_pct |>
group_by(fecha) |>
arrange(desc(porcentaje_votos)) |>
mutate(siglas = factor(siglas, levels = siglas)) |>
ungroup()# Función para generar gráficos individuales por fecha
generar_graficos <- function(datos, colores) {
# Crear una lista vacía para almacenar los gráficos
lista_graficos <- list()
# Obtener las fechas únicas
fechas_unicas <- unique(datos$fecha)
# Iterar sobre cada fecha
for (fecha_actual in fechas_unicas) {
# Filtrar los datos para la fecha actual
datos_filtrados <- datos |>
filter(fecha == fecha_actual) |>
arrange(porcentaje_votos) |>
mutate(siglas = factor(siglas, levels = siglas)) # Reordenar factores solo para esta fecha
# Convertir la fecha al formato año/mes (mes en letras abreviadas)
fecha_formateada <- format(as.Date(fecha_actual), "%b %Y")
# Crear el gráfico para la fecha actual
grafico <- ggplot(datos_filtrados, aes(x = "", y = porcentaje_votos, fill = siglas)) +
geom_col(position = "stack", width = 2.5) + # Barra apilada única
geom_text( # Etiquetas con porcentaje solo si es mayor que 2 para que se vea bien
aes(label = ifelse(porcentaje_votos >= 2, paste0(round(porcentaje_votos, 0), "%"), "")),
position = position_stack(vjust = 0.5), # Centrar el texto dentro de las barras
color = "white", # Texto en color blanco
size = 2.75,
fontface = "bold"
) +
coord_flip() +
scale_fill_manual(values = colores, name = "Partido") + # Usar colores personalizados
labs(
x = NULL,
y = NULL,
title = fecha_formateada
) +
theme_minimal(base_size = 14) +
theme(
axis.text.x = element_blank(), # Eliminar elementos no deseados
axis.ticks.x = element_blank(),
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
plot.title = element_text(size = 9, face = "italic"),
legend.position = "none" # Deshabilitar las leyendas individuales
)
# Agregar el gráfico a la lista
lista_graficos[[as.character(fecha_actual)]] <- grafico
}
# Crear el orden de partidos para la leyenda global
orden_leyenda <-
c("PSOE", "PP", "UP","Cs","VOX", "ERC", "PNV", "CIU", "BNG", "EH-BILDU", "MP", "OTROS")
leyenda <-
ggplot(resumen_agg_pct,
aes(x = siglas, y = 1, fill = siglas)) +
geom_bar(stat = "identity", width = 0) + # Asignar valores ficticios a `y`
scale_fill_manual(values = colores, breaks=orden_leyenda,name = "") +
theme_void() +
theme(
legend.position = "bottom", # Colocar la leyenda en la parte inferior
legend.text = element_text(size = 8, family = "Rockwell"), # Ajustar el tamaño del texto en la leyenda
legend.key.width = unit(0.5, "cm"), # Ajustar el ancho de las claves de la leyenda
legend.direction = "horizontal", # Disponer la leyenda horizontalmente
legend.box.spacing = unit(0.5, "cm"), # Espaciado entre los elementos de la leyenda
legend.justification = "center" # Centrar la leyenda
) +
guides(fill = guide_legend(nrow = 1)) # Forzar una sola fila para la leyenda
# Combinar los gráficos en una única columna
grafico_combinado <-
wrap_plots(lista_graficos, ncol = 1) +
plot_annotation(
title = "Porcentaje de votos por partido en cada elección",
theme = theme(plot.title = element_text(hjust = 0.5, size = 16,family = "Rockwell")))
# Añadir la leyenda al diseño final con patchwork
final_plot <-
grafico_combinado + leyenda
return(final_plot)
}
# Llamar a la función con los datos y colores
grafico_final <-
generar_graficos(resumen_agg_pct, colores)¿Qué partido fue el ganador en los municipios con más de 100.000 habitantes (censo) en cada una de las elecciones?
# quitar los guiones que separan el cod_mun para poder unirlo después en base a id_municipio
cod_mun <- cod_mun |>
mutate(cod_mun = str_replace_all(cod_mun, "-", ""))
ganadores <-
resumen |>
filter(censo > 100000) |>
group_by(fecha, id_municipio) |>
arrange(desc(votos)) |>
slice(1) |>
summarise(partido_ganador = siglas,
max_votos = votos,
censo_municipio = censo) |>
ungroup() |>
left_join(cod_mun, by = c("id_municipio" = "cod_mun"))####Añadimos gráfico de España con municipios de más de 100k habitantes coloreados por los partidos que ganaron las elecciones en cada uno de los años electorales
ganadores_LAU <- ganadores |>
mutate(id_municipio = substr(id_municipio, 3, 7))
mapa_mas100k_ganadores <- mapSpain::esp_get_munic() |>
left_join(ganadores_LAU, by = c("LAU_CODE" = "id_municipio"))
ggplot(mapa_mas100k_ganadores) +
geom_sf(aes(fill = partido_ganador), alpha = 0.7, color = "grey") +
scale_fill_manual(
values = colores) +
theme_minimal() +
labs(
fill = "partido_ganador",
title = "Partidos ganadores en municipios de más de cien mil habitantes"
) +
theme(
plot.title = element_text(hjust = 0.5),
legend.position = "bottom"
) +
facet_wrap(~ fecha)¿Qué partido fue el segundo cuando el primero fue el PSOE? ¿Y cuando el primero fue el PP?
segundos <-
resumen |>
group_by(fecha, siglas) |>
summarise(total_votos = sum(votos), .groups = "drop") |>
group_by(fecha) |>
slice_max(total_votos, n = 5) |>
arrange(fecha, desc(total_votos)) |>
ungroup()
segundos# A tibble: 30 × 3
fecha siglas total_votos
<date> <chr> <dbl>
1 2008-03-01 PSOE 11071649
2 2008-03-01 PP 10171828
3 2008-03-01 OTROS 1160323
4 2008-03-01 UP 962930
5 2008-03-01 CIU 774425
6 2011-11-01 PP 10838951
7 2011-11-01 PSOE 6975407
8 2011-11-01 OTROS 2200959
9 2011-11-01 UP 1798887
10 2011-11-01 CIU 1014277
# ℹ 20 more rows
# manera 1
primeros_segundos <-
segundos |>
group_by(fecha) |>
mutate(rank = row_number()) |> # Clasificar partidos por votos en cada año
filter(rank <= 2) |> # Filtrar los dos partidos principales de cada año
summarise(
primero = siglas[rank == 1], # partido en primer lugar
votos_1 = total_votos[rank == 1], # Número de votos del primer lugar
segundo = siglas[rank == 2], # partido en segundo lugar
votos_2 = total_votos[rank == 2] # Número de votos del segundo lugar
) |>
ungroup()
primeros_segundos# A tibble: 6 × 5
fecha primero votos_1 segundo votos_2
<date> <chr> <dbl> <chr> <dbl>
1 2008-03-01 PSOE 11071649 PP 10171828
2 2011-11-01 PP 10838951 PSOE 6975407
3 2015-12-01 PP 7114123 UP 5629623
4 2016-06-01 PP 7800328 PSOE 5424130
5 2019-04-01 PSOE 7481667 PP 4356714
6 2019-11-01 PSOE 6752314 PP 5021622
# Filtrar cuando el primer lugar es PSOE
segundo_cuando_psoe <-
primeros_segundos |>
filter(primero == "PSOE")
segundo_cuando_psoe# A tibble: 3 × 5
fecha primero votos_1 segundo votos_2
<date> <chr> <dbl> <chr> <dbl>
1 2008-03-01 PSOE 11071649 PP 10171828
2 2019-04-01 PSOE 7481667 PP 4356714
3 2019-11-01 PSOE 6752314 PP 5021622
# Filtrar cuando el primer lugar es PP
segundo_cuando_pp <-
primeros_segundos |>
filter(primero == "PP")
segundo_cuando_pp# A tibble: 3 × 5
fecha primero votos_1 segundo votos_2
<date> <chr> <dbl> <chr> <dbl>
1 2011-11-01 PP 10838951 PSOE 6975407
2 2015-12-01 PP 7114123 UP 5629623
3 2016-06-01 PP 7800328 PSOE 5424130
# manera 2
# Reordenar los niveles de 'siglas' en base a 'total_votos' (de mayor a menor)
segundos <- segundos |>
group_by(fecha) |>
mutate(siglas = fct_reorder(siglas, total_votos, .desc = TRUE)) |>
ungroup()
print(levels(segundos$siglas))[1] "PSOE" "PP" "OTROS" "UP" "CIU" "Cs" "VOX"
ggplot(segundos,
aes(x = siglas,
y = total_votos,
fill = siglas)) +
geom_col(alpha = 0.8,
width = 0.7) +
scale_fill_manual(values = colores) +
labs(title = "Los cinco partidos principales en votos por año",
subtitle = "Elecciones después de 2008",
x = "Año y partido",
y = "Número de votos",
fill = "Partido") +
theme_minimal(base_family = "Rockwell") +
theme(axis.text.x = element_text(angle = 90),
axis.title.x = element_blank(),
legend.position = "bottom") +
facet_wrap(~fecha, nrow = 1, scales = "free_x")¿A quién beneficia la baja participación?
# Calcular la participación por municipio
participacion <-
resumen |>
group_by(id_municipio, siglas) |>
summarise(total_votos = sum(votos, na.rm = TRUE), .groups = "drop") |>
left_join(resumen |>
group_by(id_municipio) |>
summarise(participacion_total = sum(votos, na.rm = TRUE), .groups = "drop"),
by = "id_municipio") |>
mutate(participacion_relativa = total_votos / participacion_total)
# Calcular la correlación entre participación total y votos relativos
correlacion <- participacion |>
group_by(siglas) |>
summarise(correlacion = cor(participacion_total, participacion_relativa, use = "complete.obs"))
#Complete.obs se ocupa de los valores NA, no se si hace falta pero por si acaso lo dejo puesto
#Deberían salir nº entre -1 y 1, si está por encima de 0 la correlación es positiva lo que significa que saldría beneficiado si la participación es alta, y al revés con los resultados negativos
#Un coeficiente de correlación POSITIVO significa que, a medida que AUMENTA la participación, la proporción de votos de ese partido tiende a AUMENTAR
#Correlación positiva → Beneficio con alta participación.
#Correlación negativa → Beneficio con baja participación.
#Estamos haciendo la correlación entre estas dos cosas
#Participación total: el total de votos emitidos en un municipio
#Proporción de votos de un partido (participacion relativa): los votos de un partido como fracción de los votos totales.
# Visualización de resultados con un gráfico de barras
ggplot(correlacion, aes(x = reorder(siglas, correlacion), y = correlacion)) +
geom_col(fill = "green") +
labs(
title = "Correlación entre participación y votos por partido",
x = "Partido",
y = "Correlación"
) #poner una leyenda con la explicación de cor positiva y negativa y lo que significan con relacion a los datos y el enunciado¿Cómo analizar la relación entre censo y voto? ¿Es cierto que determinados partidos ganan en las zonas rurales?
# ANALIZANDO RELACIÓN ENTRE CENSO Y VOTO
# Calculamos el total de votos por municipio y por fecha electoral
relacion_censo_votos <-
resumen |>
group_by(fecha, id_municipio, censo) |>
summarise(Total_votos = sum(votos), .groups = "drop")
# Calcular la correlación entre censo y votos totales
correlacion <-
cor(relacion_censo_votos$censo, relacion_censo_votos$Total_votos)
print(paste("Correlación entre censo y votos totales:",
round(correlacion, 2)))[1] "Correlación entre censo y votos totales: 1"
# Visualizar la correlación
ggplot(relacion_censo_votos, aes(x = censo, y = Total_votos)) +
geom_point(alpha = 0.7) +
geom_smooth(method = "lm", color = "blue", se = FALSE) +
labs(
title = "Relación entre censo y votos totales",
x = "Censo (personas censadas)",
y = "Votos totales"
) +
theme_minimal()# ANALIZANDO SI CIERTOS PARTIDOS GANAN MÁS EN ZONAS RURALES QUE EN ZONAS URBANAS
# Creamos una tabla en donde guardamos el tipo de zona según el censo: Rural o Urbano
rurales_urbanas <-
resumen |>
mutate("Zona" = ifelse(censo < 10000,
"Rural",
"Urbano"))
# Calculamos los votos de cada partido para cada tipo de zona en cada elección
votos_por_zona <-
rurales_urbanas |>
group_by(fecha, Zona, siglas) |>
summarise(Total_votos = sum(votos),
.groups = "drop")
# Creamos el gráfico que muestre las diferencias entre partidos, tipos de zona y fechas de elecciones
ggplot(votos_por_zona,
aes(x = siglas, y = Total_votos, fill = Zona)) +
geom_bar(stat = "identity", position = "dodge") +
facet_wrap(~ fecha, ncol = 2) + # Dividir gráficos por fecha de elección
labs(
title = "Comparación de votos por partido entre zonas rurales y urbanas",
x = "Siglas",
y = "Total de Votos",
fill = "Zona") +
theme_minimal(base_family = "Rockwell") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))# Como era de esperar, nos salen 6 gráficos (uno por cada fecha electoral) pero el problema es que puede ser bastante complicado de entender a la hora de exponerlo. Es por ello que creo conveniente poner 3 gráficos pero por separados que muestren cómo ha ido evolucionando los votos a lo largo del tiempo, por ejemplo el gráfico del 2008, el del 2016 y el del 2019
# GRÁFICOS 2008, 2016 Y 2019
# 2008
votos_por_zona_2008 <-
rurales_urbanas |>
filter(fecha == "2008-03-01") |>
group_by(Zona, siglas) |>
summarise(Total_votos = sum(votos), .groups = "drop")
zona_2008 <-
ggplot(votos_por_zona_2008, aes(x = siglas, y = Total_votos, fill = Zona)) +
geom_bar(stat = "identity", position = "dodge") +
labs(
title = "Comparación de votos por partido entre zonas rurales y urbanas en Marzo de 2008",
x = "Siglas",
y = "Total de Votos",
fill = "Zona"
) +
theme_minimal(base_family = "Rockwell") +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
theme(plot.title = element_text(size = 11))
# 2016
votos_por_zona_2016 <-
rurales_urbanas |>
filter(fecha == "2016-06-01") |>
group_by(Zona, siglas) |>
summarise(Total_votos = sum(votos), .groups = "drop")
zona_2016 <-
ggplot(votos_por_zona_2016, aes(x = siglas, y = Total_votos, fill = Zona)) +
geom_bar(stat = "identity", position = "dodge") +
labs(
title = "Comparación de votos por partido entre zonas rurales y urbanas en Junio de 2016",
x = "Siglas",
y = "Total de Votos",
fill = "Zona"
) +
theme_minimal(base_family = "Rockwell") +
theme(axis.text.x = element_text(angle = 45,
hjust = 1)) +
theme(plot.title = element_text(size = 11))
# 2019 (la última)
votos_por_zona_2019 <-
rurales_urbanas |>
filter(fecha == "2019-11-01") |>
group_by(Zona, siglas) |>
summarise(Total_votos = sum(votos), .groups = "drop")
zona_2019 <-
ggplot(votos_por_zona_2019, aes(x = siglas,
y = Total_votos,
fill = Zona)) +
geom_bar(stat = "identity", position = "dodge") +
labs(
title = "Comparación de votos por partido entre zonas rurales y urbanas en Noviembre de 2019",
x = "Siglas",
y = "Total de Votos",
fill = "Zona"
) +
theme_minimal(base_family = "Rockwell") +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
theme(plot.title = element_text(size = 11))
ggplotly(zona_2008)¿Cómo calibrar el error de las encuestas (recordemos que las encuestas son de intención de voto a nivel nacional)?
#dar el mismo formato de resumen a surveys
surveys_2 <- surveys |>
pivot_longer(cols = "UCD":"EV", names_to = "partidos", values_to = "porcentaje", values_drop_na = TRUE )
# agrupar los partidos
surveys_2 <-
surveys_2 |>
mutate(partidos = case_when(
str_detect(partidos, "UP|IU|PODEMOS|COMPROMIS") ~ "UP",
str_detect(partidos, "PP") ~ "PP",
str_detect(partidos, "PNV") ~ "PNV",
str_detect(partidos, "PSOE") ~ "PSOE",
str_detect(partidos, "MP") ~ "MP",
str_detect(partidos, "VOX") ~ "VOX",
str_detect(partidos, "EH-BILDU|AMAIUR") ~ "EH-BILDU",
str_detect(partidos, "ERC") ~ "ERC",
str_detect(partidos, "BNG") ~ "BNG",
str_detect(partidos, "CS") ~ "Cs",
str_detect(partidos, "CIU|CDC") ~ "CIU",
TRUE ~ "OTROS"
))
#el valor porcentaje_estimado que aparece en cada pollster para cada eleccion y partido es la media ya que alexandra y yo hemos pensado que para compararlo con los resultados reales lo más conveniente es tener un único dato por casa, partido y elección, ya que es como aparece en los resultados reales
casas_encuestadoras <- surveys_2 |>
select(c(date_elec,id_pollster,pollster,partidos,porcentaje)) |> #seleccionamos solo las columnas necesarias
mutate(date_elec = format(as.Date(date_elec), "%Y-%m")) |> #quitamos el día para después no tener problemas en la comparación
group_by(date_elec, id_pollster, partidos) |>
mutate(porcentaje_estimado = mean(porcentaje, na.rm = TRUE)) |>
distinct() #eliminar columnas repetidas
# suma de los votos a nivel nacional por eleccion y partido, se convierte este dato en porcentaje para poder compararlo con los datos de surveys
resultados <- resumen |>
mutate(fecha = format(as.Date(fecha), "%Y-%m")) |>
group_by(fecha, siglas) |>
summarise(Votos_Totales = sum(votos), .groups = "drop") |>
group_by(fecha) |>
mutate(Porcentaje_real = Votos_Totales / sum(Votos_Totales) * 100) |>
select(fecha, siglas, Porcentaje_real)
comparacion <- casas_encuestadoras |>
inner_join(resultados, by = c("date_elec" = "fecha", "partidos" = "siglas")) |> #unir por fecha y partido
mutate(error = Porcentaje_real - porcentaje_estimado) |>
select(date_elec, id_pollster, pollster, partidos, Porcentaje_real, porcentaje_estimado, error)
comparacion# A tibble: 4,372 × 7
# Groups: date_elec, id_pollster, partidos [839]
date_elec id_pollster pollster partidos Porcentaje_real porcentaje_estimado
<chr> <chr> <chr> <chr> <dbl> <dbl>
1 2008-03 pollster-49 GESOP PSOE 44.2 42.6
2 2008-03 pollster-49 GESOP UP 3.84 4.55
3 2008-03 pollster-49 GESOP PNV 1.21 2.43
4 2008-03 pollster-49 GESOP ERC 1.16 2.65
5 2008-03 pollster-49 GESOP UP 3.84 4.55
6 2008-03 pollster-49 GESOP PP 40.6 38.7
7 2008-03 pollster-49 GESOP PSOE 44.2 42.6
8 2008-03 pollster-49 GESOP UP 3.84 4.55
9 2008-03 pollster-49 GESOP UP 3.84 4.55
10 2008-03 pollster-49 GESOP PP 40.6 38.7
# ℹ 4,362 more rows
# ℹ 1 more variable: error <dbl>
¿Qué casas encuestadoras acertaron más y cuáles se desviaron más de los resultados?
Sugerencia: Añadir un gráfico interactivo como este donde los puntos son las previsiones de las casas encuestadoreas y las barras los resultados reales
Nos dice algo sobre el resultado final de las elecciones que se hayan emitido más votos en la primera sesión que en la segunda? ¿Podemos afirmar que los votantes de un partido son más madrugadores que otros?
Elaborar mapas de España con ganadores y participacion por provincia y ccaa
totales_election_data <-
election_data |>
# Extraer los primeros cuatro dígitos y crear una nueva columna de codigo de provincia
mutate(provincia = substr(id_municipio, 1, 4)) |>
group_by(provincia, fecha) |>
summarise(
total_votos = sum(votos, na.rm = TRUE),
# Sumar el total de votos
censo = mean(censo, na.rm = TRUE),
# Calcular el promedio del censo
participacion = total_votos / censo,
# Calcular la participación
.groups = "drop"
# Eliminar los grupos
)ganadores_todos <-
resumen |>
# Extraer los primeros cuatro dígitos y crear una nueva columna de codigo de provincia
mutate(provincia = substr(id_municipio, 1, 4)) |>
group_by(fecha, provincia) |>
summarise(
partido_ganador = siglas[which.max(votos)],
# Encontrar el partido con más votos
max_votos = max(votos),
# Encontrar el número máximo de votos
total_votos = sum(votos),
# Calcular el total de votos
.groups = "drop"
)# Combinar datos de totales y ganadores
ganadores_por_anno <-
totales_election_data |>
inner_join(ganadores_todos, by = c("provincia", "fecha")) |>
# Dividir la columna cpro en codauto (primeros 2 dígitos) y cpro (últimos 2 dígitos)
mutate(codauto = substr(provincia, 1, 2),
cpro = substr(provincia, 3, 4))# Obtener el mapa de provincias
data_provincias <-
esp_get_prov()
# Unir los datos de ganadores y participación al mapa
mapa_datos <-
data_provincias |>
left_join(ganadores_por_anno, by = "cpro")
ggplot(mapa_datos) +
geom_sf(aes(fill = partido_ganador,
alpha = participacion),
color = "white",
size = 0.2) +
scale_fill_manual(values = colores, name = "Partido Ganador")+
facet_wrap(~fecha)+
labs(
title = "Ganadores y Participación por Provincia en España",
subtitle = "Alpha representa la participación"
) +
guides(alpha = "none") +
theme_minimal(base_family = "Rockwell") Se suele decir que la población de Zaragoza es una muestra representativa de la población española ¿Son los resultados electorales en Zaragoza extrapolables a la población española, excluyendo los votos regionalistas o independentistas?
Serían los resultados obtenidos similares a los reales si nos quedáramos solo con los votos de la sesión1 (por la mañana) o los de la sesión 2 (por la tarde)?